﻿/*****************************************介绍*****************************************
 * 作者：User
 * 创建时间：2025-06-03 18:58:11
 * 功能：用于处理字符串的一些公共功能的类
**************************************************************************************/

using System;
using UnityEngine;
using UnityEngine.Events;

namespace Game.Framework.Utility
{
    public class TextUtil
    {
        #region 字符串拆分相关
        /// <summary>
        /// 拆分字符串 返回字符串数组
        /// </summary>
        /// <param name="str">想要被拆分的字符串</param>
        /// <param name="type">拆分字符类型： 1-; 2-, 3-% 4-: 5-空格 6-| 7-_ </param>
        /// <returns></returns>
        public static string[] SplitStr(string str, int type = 1)
        {
            if (str == "")
                return new string[0];
            string newStr = str;
            if (type == 1)
            {
                //为了避免英文符号填成了中文符号 我们先进行一个替换
                while (newStr.IndexOf("；") != -1)
                    newStr = newStr.Replace("；", ";");
                return newStr.Split(';');
            }
            else if (type == 2)
            {
                //为了避免英文符号填成了中文符号 我们先进行一个替换
                while (newStr.IndexOf("，") != -1)
                    newStr = newStr.Replace("，", ",");
                return newStr.Split(',');
            }
            else if (type == 3)
            {
                return newStr.Split('%');
            }
            else if (type == 4)
            {
                //为了避免英文符号填成了中文符号 我们先进行一个替换
                while (newStr.IndexOf("：") != -1)
                    newStr = newStr.Replace("：", ":");
                return newStr.Split(':');
            }
            else if (type == 5)
            {
                return newStr.Split(' ');
            }
            else if (type == 6)
            {
                return newStr.Split('|');
            }
            else if (type == 7)
            {
                return newStr.Split('_');
            }

            return new string[0];
        }

        /// <summary>
        /// 拆分字符串 返回整形数组
        /// </summary>
        /// <param name="str">想要被拆分的字符串</param>
        /// <param name="type">拆分字符类型： 1-; 2-, 3-% 4-: 5-空格 6-| 7-_ </param>
        /// <returns></returns>
        public static int[] SplitStrToIntArr(string str, int type = 1)
        {
            //得到拆分后的字符串数组
            string[] strs = SplitStr(str, type);
            if (strs.Length == 0)
                return new int[0];
            //把字符串数组 转换成 int数组 
            return Array.ConvertAll<string, int>(strs, (str) =>
            {
                return int.Parse(str);
            });
        }

        /// <summary>
        /// 专门用来拆分多组键值对形式的数据的 以int返回
        /// </summary>
        /// <param name="str">待拆分的字符串</param>
        /// <param name="typeOne">组间分隔符  1-; 2-, 3-% 4-: 5-空格 6-| 7-_ </param>
        /// <param name="typeTwo">键值对分隔符 1-; 2-, 3-% 4-: 5-空格 6-| 7-_ </param>
        /// <param name="callBack">回调函数</param>
        public static void SplitStrToIntArrTwice(string str, int typeOne, int typeTwo, UnityAction<int, int> callBack)
        {
            string[] strs = SplitStr(str, typeOne);
            if (strs.Length == 0)
                return;
            int[] ints;
            for (int i = 0; i < strs.Length; i++)
            {
                //拆分单个道具的ID和数量信息
                ints = SplitStrToIntArr(strs[i], typeTwo);
                if (ints.Length == 0)
                    continue;
                callBack.Invoke(ints[0], ints[1]);
            }
        }

        /// <summary>
        /// 专门用来拆分多组键值对形式的数据的 以string返回
        /// </summary>
        /// <param name="str">待拆分的字符串</param>
        /// <param name="typeOne">组间分隔符 1-; 2-, 3-% 4-: 5-空格 6-| 7-_ </param>
        /// <param name="typeTwo">键值对分隔符  1-; 2-, 3-% 4-: 5-空格 6-| 7-_ </param>
        /// <param name="callBack">回调函数</param>
        public static void SplitStrTwice(string str, int typeOne, int typeTwo, UnityAction<string, string> callBack)
        {
            string[] strs = SplitStr(str, typeOne);
            if (strs.Length == 0)
                return;
            string[] strs2;
            for (int i = 0; i < strs.Length; i++)
            {
                //拆分单个道具的ID和数量信息
                strs2 = SplitStr(strs[i], typeTwo);
                if (strs2.Length == 0)
                    continue;
                callBack.Invoke(strs2[0], strs2[1]);
            }
        }


        #endregion

        #region 数字转字符串相关
        /// <summary>
        /// 得到指定长度的数字转字符串内容，如果长度不够会在前面补0，如果长度超出，会保留原始数值
        /// </summary>
        /// <param name="value">数值</param>
        /// <param name="len">长度</param>
        /// <returns></returns>
        public static string GetNumStr(int value, int len)
        {
            //tostring中传入一个 Dn 的字符串
            //代表想要将数字转换为长度位n的字符串
            //如果长度不够 会在前面补0
            return value.ToString($"D{len}");
        }
        /// <summary>
        /// 让指定浮点数保留小数点后n位
        /// </summary>
        /// <param name="value">具体的浮点数</param>
        /// <param name="len">保留小数点后n位</param>
        /// <returns></returns>
        public static string GetDecimalStr(float value, int len)
        {
            //tostring中传入一个 Fn 的字符串
            //代表想要保留小数点后几位小数
            return value.ToString($"F{len}");
        }

        // 单位定义（从空字符串到百京）
        private static string[] units = { "", "k", "M", "B", "T", "Qa", "Qi" };

        /// <summary>将数字转换成带单位的格式，保留一位小数</summary>
        public static string FormatNumber(double number)
        {
            // 处理负数和零
            if (number < 0) return "-" + FormatNumber(-number);
            if (Math.Abs(number) < 0.0001) return "0";

            int unitIndex = 0;
            double num = number;

            // 循环除以1000直到数字小于1000或单位用完
            while (num >= 1000 && unitIndex < units.Length - 1)
            {
                num /= 1000.0;
                unitIndex++;
            }

            // 检查是否需要进位（如999.9四舍五入后进位）
            if (unitIndex < units.Length - 1 && num >= 999.95)
            {
                num /= 1000.0;
                unitIndex++;
            }

            // 四舍五入到一位小数
            num = Math.Round(num, 1);

            // 格式化数字：整数部分直接显示，小数部分保留至多一位
            return num.ToString(num % 1 == 0 ? "0" : "0.#") + units[unitIndex];
        }

        #endregion

        #region 其他
        ///<summary>获取当前平台的简化名称</summary>
        public static string GetPlatformShortName()
        {
#if UNITY_IOS
            return "ios";
#elif UNITY_ANDROID
            return "android";
#elif UNITY_STANDALONE_WIN
            return "windows";
#else
            return "unknown";
#endif
        }

        /// <summary>获取指定系统语言的简化名称</summary>
        public static string GetLanguageShortName(SystemLanguage lan) => lan switch
        {
            SystemLanguage.Spanish => "es",                     // 西班牙语
            SystemLanguage.Portuguese => "pt",                  // 葡萄牙语
            SystemLanguage.French => "fr",                      // 法语
            SystemLanguage.Belarusian => "ru",                  // 白俄罗斯语
            SystemLanguage.German => "de",                      // 德语
            SystemLanguage.Italian => "it",                     // 意大利语
            SystemLanguage.Arabic => "ar",                      // 阿拉伯语
            SystemLanguage.Japanese => "ja",                    // 日语
            SystemLanguage.Korean => "ko",                      // 韩语
            SystemLanguage.Chinese => "zh",                     // 中文
            SystemLanguage.ChineseSimplified => "zh",           // 中文简体
            SystemLanguage.ChineseTraditional => "zh-hant",     // 中文繁体
            SystemLanguage.Afrikaans => "af",                   // 南非荷兰语
            SystemLanguage.Basque => "ba",                      // 巴斯克语
            SystemLanguage.Bulgarian => "bu",                   // 保加利亚语
            SystemLanguage.Catalan => "ca",                     // 加泰罗尼亚语
            SystemLanguage.Czech => "cz",                       // 捷克语
            SystemLanguage.Danish => "da",                      // 丹麦语
            SystemLanguage.Dutch => "du",                       // 荷兰语
            SystemLanguage.Estonian => "est",                   // 爱沙尼亚语
            SystemLanguage.Faroese => "fa",                     // 法罗语
            SystemLanguage.Finnish => "fi",                     // 芬兰语
            SystemLanguage.Greek => "gr",                       // 希腊语
            SystemLanguage.Hebrew => "he",                      // 希伯来语
            SystemLanguage.Icelandic => "ic",                   // 冰岛语
            SystemLanguage.Indonesian => "in",                  // 印尼语
            SystemLanguage.Latvian => "la",                     // 拉脱维亚语
            SystemLanguage.Lithuanian => "li",                  // 立陶宛语
            SystemLanguage.Norwegian => "no",                   // 挪威语
            SystemLanguage.Polish => "po",                      // 波兰语
            SystemLanguage.Romanian => "ro",                    // 罗马尼亚语
            SystemLanguage.Russian => "rus",                    // 俄语
            SystemLanguage.SerboCroatian => "se",               // 塞尔维亚-克罗地亚语
            SystemLanguage.Slovak => "sl",                      // 斯洛伐克语
            SystemLanguage.Slovenian => "slo",                  // 斯洛维尼亚语
            SystemLanguage.Swedish => "sw",                     // 瑞典语
            SystemLanguage.Thai => "th",                        // 泰语
            SystemLanguage.Turkish => "tu",                     // 土耳其语
            SystemLanguage.Ukrainian => "uk",                   // 乌克兰语
            SystemLanguage.Vietnamese => "vi",                  // 越南语
            SystemLanguage.Hungarian => "hu",                   // 匈牙利语。
            _ => "en",
        };
        #endregion
    }
}